package dao;

import java.util.Collection;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import model.Cliente;
import model.OrdemServico;
import enumtype.OrdemServicoBaixada;
import enumtype.StatusOrdemServico;
import facade.NaoTemParaBaixarException;
@Stateless
public class OrdemServidoDAO implements OrdemServicoDAOLocal{
	@PersistenceContext
	private EntityManager entityManager;
	
	@EJB
	private ClienteDAOLocal clienteDAO;

	@Override
	public long grava(String descProbl, Integer idCliente, Character tipoServ) {
		OrdemServico os = new OrdemServico();
		os.setDataAbertura(new Date());
		os.setDescricaoProblema(descProbl);
		os.setDataAbertura(new Date()); 
		os.setStatus(StatusOrdemServico.ABERTA);
		os.setBaixada(OrdemServicoBaixada.NAO);
		os.setTipoServico(tipoServ);
		Cliente cli = entityManager.find(Cliente.class, idCliente);
		os.setCliente(cli);
		entityManager.persist(os);
		entityManager.flush();
		entityManager.refresh(os);
		System.out.println(os.getId());
		
		return os.getId();
	}
	
	@Override
	public void atualiza(Integer id, Character tipoServ, String problemaInformado, StatusOrdemServico status) {
		OrdemServico os = entityManager.find(OrdemServico.class, id);
		os.setDescricaoProblema(problemaInformado);
		os.setStatus(status);
		os.setTipoServico(tipoServ);
		os = entityManager.merge(os);
	}
	
	@Override
	@SuppressWarnings("unchecked")
	public Collection<OrdemServico> findOSByTel(String tel, String ddd) throws ItemNaoEncontradoException {
		Query q = entityManager.createNamedQuery("findOSByTel");
		q.setParameter(1, tel);
		q.setParameter(2, ddd);
		Collection <OrdemServico> lista = q.getResultList();
		if (lista != null && !lista.isEmpty()) {
			return lista;
		}
		else throw new ItemNaoEncontradoException();
	}
	
	@Override
	@SuppressWarnings("unchecked")
	public Collection<OrdemServico> findOSByNomeCliente(String nomeRazao) throws ItemNaoEncontradoException {
		//1 - Encontrar IDs de clientes através do nome
		StringBuilder queryPesquisa = new StringBuilder("select o from OrdemServico o where o.cliente.id in");
		Collection<Cliente> clientes = clienteDAO.findClientesByNome(nomeRazao);
		StringBuilder conjuntoPesquisa = new StringBuilder("(");
		for (Cliente cliente : clientes) {
			conjuntoPesquisa.append(cliente.getId());
			conjuntoPesquisa.append(",");
		}
		conjuntoPesquisa.append("0)");
		queryPesquisa.append(conjuntoPesquisa);
		Query q = entityManager.createQuery(queryPesquisa.toString());
		Collection<OrdemServico> lista = q.getResultList();
		
		if (lista != null && !lista.isEmpty()) {
			return lista;
		}
		else throw new ItemNaoEncontradoException();
	}
	
	
	
	@Override
	@SuppressWarnings("unchecked")
	public Collection<OrdemServico> findOSByNumOs(int numero) throws ItemNaoEncontradoException {
		Query q = entityManager.createNamedQuery("findOSByNumOS");
		q.setParameter(1, numero);
		Collection <OrdemServico> lista = q.getResultList();
		if (lista != null && !lista.isEmpty()) {
			return lista;
		}
		else throw new ItemNaoEncontradoException();
	}

	@Override
	public void atualizaStatus(int numOs, StatusOrdemServico status) {
		OrdemServico os = entityManager.find(OrdemServico.class, numOs);
		os.setStatus(status);
		os = entityManager.merge(os);
	}
	
	@Override
	@SuppressWarnings("unchecked")
	public OrdemServico findOSParaBaixar() throws NaoTemParaBaixarException {
		Query q = entityManager.createNamedQuery("findOSParaBaixar");
		List <OrdemServico> lista = q.getResultList();
		if (lista != null && !lista.isEmpty()) {
			OrdemServico os = lista.get(0);
			os.setBaixada(OrdemServicoBaixada.SIM);
			os = entityManager.merge(os);
			return os;
		}
		else throw new NaoTemParaBaixarException("Nenhuma OS encontrada");
	}
	
	@Override
	@SuppressWarnings("unchecked")
	public Collection <OrdemServico> findAllOSs() throws ItemNaoEncontradoException {
		Query q = entityManager.createNamedQuery("findAllOSs");
		Collection <OrdemServico> lista = q.getResultList();
		if (lista != null && !lista.isEmpty()) {
			return lista;
		}
		else throw new ItemNaoEncontradoException();
	}
	
	@Override
	public void cancelar(int numOs) {
		atualizaStatus(numOs, StatusOrdemServico.CANCELADA);
		OrdemServico os = entityManager.find(OrdemServico.class, numOs);
		os.setBaixada(OrdemServicoBaixada.SIM);
	}
	
	@Override
	public void atualizaStatus(int numOs, String descrServico, StatusOrdemServico status) {
		OrdemServico os = entityManager.find(OrdemServico.class, numOs);
		os.setDescricaoServico(descrServico);
		os.setStatus(status);
		os = entityManager.merge(os);
		
	}
}
